package com.android.launcher3;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

import android.content.ContentValues;
import android.graphics.Bitmap;
import android.util.Log;

/**
 * 完整 Represents an item in the launcher.
 */
class ItemInfo {
	/** Indicates whether the item is a gesture. */
	boolean isGesture = false;

	/** Indicates the X position of the associated cell. */
	int cellX = -1;

	/** Indicates the Y position of the associated cell. */
	int cellY = -1;

	/**
	 * One of {@link LauncherSettings.Favorites#ITEM_TYPE_APPLICATION},
	 * {@link LauncherSettings.Favorites#ITEM_TYPE_SHORTCUT},
	 * {@link LauncherSettings.Favorites#ITEM_TYPE_USER_FOLDER}, or
	 * {@link LauncherSettings.Favorites#ITEM_TYPE_APPWIDGET}.
	 */
	int itemType;

	/** Iindicates the screen in which the shortcut appears. */
	int screen = -1;

	/** Indicates the X cell span. */
	int spanX = 1;

	/** Indicates the Y cell span. */
	int spanY = 1;

	/**
	 * The id of the container that holds this item. For the desktop, this will
	 * be {@link LauncherSettings.Favorites#CONTAINER_DESKTOP}. For the all
	 * applications folder it will be {@link #NO_ID} (since it is not stored in
	 * the settings DB). For user folders it will be the id of the folder.
	 */
	long container = NO_ID;

	/** The id in the settings database for this item */
	long id = NO_ID;

	/** TODO */
	static final int NO_ID = -1;

	/**
	 * Creates a new ItemInfo object.
	 */
	ItemInfo() {
	}

	/**
	 * Creates a new ItemInfo object.
	 */
	ItemInfo(final ItemInfo info) {
		id = info.id;
		cellX = info.cellX;
		cellY = info.cellY;
		spanX = info.spanX;
		spanY = info.spanY;
		screen = info.screen;
		itemType = info.itemType;
		container = info.container;
	}

	static byte[] flattenBitmap(final Bitmap bitmap) {
		// Try go guesstimate how much space the icon will take when serialized
		// to avoid unnecessary allocations/copies during the write.
		int size = bitmap.getWidth() * bitmap.getHeight() * 4;
		ByteArrayOutputStream out = new ByteArrayOutputStream(size);

		try {
			bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
			out.flush();
			out.close();

			return out.toByteArray();
		} catch (final IOException e) {
			Log.w("Favorite", "Could not write icon");

			return null;
		}
	}

	/**
	 * Write the fields of this item to the DB
	 * 
	 * @param values
	 */
	void onAddToDatabase(final ContentValues values) {
		values.put(LauncherSettings.BaseLauncherColumns.ITEM_TYPE, itemType);

		if (!isGesture) {
			values.put(LauncherSettings.Favorites.CONTAINER, container);
			values.put(LauncherSettings.Favorites.SCREEN, screen);
			values.put(LauncherSettings.Favorites.CELLX, cellX);
			values.put(LauncherSettings.Favorites.CELLY, cellY);
			values.put(LauncherSettings.Favorites.SPANX, spanX);
			values.put(LauncherSettings.Favorites.SPANY, spanY);
		}
	}

	static void writeBitmap(final ContentValues values, final Bitmap bitmap) {
		if (bitmap != null) {
			byte[] data = flattenBitmap(bitmap);
			values.put(LauncherSettings.Favorites.ICON, data);
		}
	}

	void unbind() {
	}
}
